#ifndef EPOLL_SERVER_CPLUS_H
#define EPOLL_SERVER_CPLUS_H

#include <sys/socket.h>
#include <sys/epoll.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_EVENTS 10000

class EpollEvents;

//创建维护数组.维护每一个描述符fd的回调函数,事件,状态,内存,长度,偏移,上次活动时间.
typedef struct myevent_s
{
	int fd;
	void (EpollEvents:: *call_back)(int fd, int events, void* arg);
	int  events;
	void* arg;
	int  status;
	int  s_offset;
	long last_active;
}TServEvents;
//要将TServEvents暴露出来

class EpollEvents
{
	public:
		EpollEvents();
		~EpollEvents();
		//初始化,对应的描述符的每一个维护数组.
		void EventSet(TServEvents* ev, int fd, void(EpollEvents:: *call_back)(int, int, void*), void *arg);
		//向epoll管理添加events,并将events和维护数组通过,事件的.data.ptr对应起来.
		void EventAdd(int epollFd, int events, TServEvents* ev);
		//在epoll管理中删除ev所对应的事件.并将维护事件的数组对应的状态置为0(0为该数组值为未使用状态,1为该数组值使用状态).
		void EventDel(int epollFd, TServEvents *ev);
		//当有新链接到来时触发的调用.
		void AcceptConn(int fd, int events, void *arg);
		//初始化链接.
		void InitListenSocket(short port);
		//检查在epoll管理中有超过60s的链接,并删除.
		void CheckTimeOut();
		//返回得到的events数.
		int EpollWait(struct epoll_event *events);
		//返回listenid
		int GetListenID();		
	private:
		int g_epollFd;	//epoll管理
		TServEvents g_Events[MAX_EVENTS+1];		//维护epoll数组
		int CheckPos;
		int fds;
		int listenFd;
};

#endif




















